package cn.itcast.order.controller;


import cn.itcast.hmall.dto.common.ResultDTO;
import cn.itcast.hmall.dto.order.OrderReqDTO;
import cn.itcast.hmall.pojo.order.Order;
import cn.itcast.order.service.IOrderService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import org.springframework.stereotype.Controller;

/**
 * <p>
 *  前端控制器
 * </p>
 *
 * @author 哈纳桑
 * @since 2024-07-13
 */
@RestController
@Slf4j
public class OrderController {

    @Autowired
    IOrderService orderService;

    /**
     * 提交订单
     * - 1）根据雪花算法生成订单id**(mybatisplus自带)**
     * - 2）商品微服务提供FeignClient，实现根据id查询商品的接口
     * - 3）根据itemId查询商品信息
     * - 4）基于商品价格、购买数量计算商品总价：totalFee
     * - 5）封装Order对象，初始status为未支付
     * - 6）将Order写入数据库tb_order表中
     * - 7）将商品信息、orderId信息封装为OrderDetail对象，写入tb_order_detail表
     * - 8）将user-service的根据id查询地址接口封装为FeignClient
     * - 9）根据addressId查询user-service服务，获取地址信息
     * - 10）将地址封装为OrderLogistics对象，写入tb_order_logistics表
     * - 11）在item-service提供减库存接口，并编写FeignClient
     * - 12）调用item-service的减库存接口
     * @param orderReqDTO
     * @return
     */
    @PostMapping("/order")
    public Long createOrder(@RequestBody OrderReqDTO orderReqDTO){
        log.info("创建订单");
        return orderService.ctreateOrder(orderReqDTO);
    }

    /**
     * 查询订单
     */
    @GetMapping("/order/{orderId}")
    public Order getOrder(@PathVariable("orderId")Long orderId){
        log.info("查询订单");
        return orderService.getById(orderId);
    }



    /**
     * 支付订单
     * - 根据订单id查询订单信息
     * - 检查订单状态是否为1  如果为1继续 如果为其它状态结束请求
     * - 获取当前登录用户id, 使用feign查询用户信息
     * - 判断输入的密码是否正确:   密码使用md5加密
     * - 如果密码正确， 使用feign扣减用户账户余额 并更改订单状态为已支付
     */
    @PutMapping("/pay/{orderId}")
    public ResultDTO payOrder(@PathVariable("orderId")Long orderId, @RequestBody OrderReqDTO reqDTO){
        log.info("支付订单");
        return orderService.payOrder(orderId,reqDTO);
    }
}
